/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002-2006
* Sleepycat Software. All rights reserved.
*
* $Id: MapLN.java,v 1.1 2006/05/06 09:00:19 ckaestne Exp $
*/
package com.sleepycat.je.tree;
import java.nio.ByteBuffer;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.dbi.DatabaseImpl;
import com.sleepycat.je.log.LogEntryType;
import com.sleepycat.je.log.LogException;
import com.sleepycat.je.log.LogUtils;
/**
* A MapLN represents a Leaf Node in the JE DatabaseImpl Naming Tree.
*/
public final class MapLN extends LN {
private static final String BEGIN_TAG = "<mapLN>";
private static final String END_TAG = "</mapLN>";
private DatabaseImpl databaseImpl;
private boolean deleted;
/**
* Create a new MapLn to hold a new databaseImpl. In the ideal world, we'd
* have a base LN class so that this MapLN doesn't have a superfluous data
* field, but we want to optimize the LN class for size and speed right
* now.
*/
public MapLN(DatabaseImpl db) {
super(new byte[0]);
databaseImpl = db;
deleted = false;
}
/**
* Create an empty MapLN, to be filled in from the log.
*/
public MapLN()
throws DatabaseException {
super();
databaseImpl = new DatabaseImpl();
}
public boolean isDeleted() {
return deleted;
}
void makeDeleted() {
deleted = true;
/* Release all references to nodes held by this database. */
databaseImpl.getTree().setRoot(null, true);
}
public DatabaseImpl getDatabase() {
return databaseImpl;
}
/**
* Initialize a node that has been faulted in from the log.
*/
public void postFetchInit(DatabaseImpl db, long sourceLsn)
throws DatabaseException {
databaseImpl.setEnvironmentImpl(db.getDbEnvironment());
}
/*
* Dumping
*/
public String toString() {
return dumpString(0, true);
}
public String beginTag() {
return BEGIN_TAG;
}
public String endTag() {
return END_TAG;
}
public String dumpString(int nSpaces, boolean dumpTags) {
StringBuffer sb = new StringBuffer();
sb.append(super.dumpString(nSpaces, dumpTags));
sb.append('\n');
sb.append(TreeUtils.indent(nSpaces));
sb.append("<deleted val=\"").append(Boolean.toString(deleted));
sb.append("\">");
sb.append('\n');
sb.append(databaseImpl.dumpString(nSpaces));
return sb.toString();
}
/*
* Logging
*/
/**
* Log type for transactional entries.
*/
protected LogEntryType getTransactionalLogType() {
return LogEntryType.LOG_MAPLN_TRANSACTIONAL;
}
/**
* @see LN#getLogType
*/
public LogEntryType getLogType() {
return LogEntryType.LOG_MAPLN;
}
/**
* @see LN#getLogSize
*/
public int getLogSize() {
return super.getLogSize() +
databaseImpl.getLogSize() +
LogUtils.getBooleanLogSize();
}
/**
* @see LN#writeToLog
*/
public void writeToLog(ByteBuffer logBuffer) {
/* Ask ancestors to write to log. */
super.writeToLog(logBuffer);
databaseImpl.writeToLog(logBuffer);
LogUtils.writeBoolean(logBuffer, deleted);
}
/**
* @see LN#readFromLog
*/
public void readFromLog(ByteBuffer itemBuffer, byte entryTypeVersion)
throws LogException {
super.readFromLog(itemBuffer, entryTypeVersion);
databaseImpl.readFromLog(itemBuffer, entryTypeVersion);
deleted = LogUtils.readBoolean(itemBuffer);
}
/**
* Dump additional fields. Done this way so the additional info can be
* within the XML tags defining the dumped log entry.
*/
protected void dumpLogAdditional(StringBuffer sb, boolean verbose) {
databaseImpl.dumpLog(sb, true);
}
}